package village.rainbow.slipin.util;

public class MathUtil {

	/**
	 * 절상, 절하, 반올림 처리
	 * @param strMode  - 수식
	 * @param nCalcVal - 처리할 값(소수점 이하 데이터 포함)
	 * @param nDigit   - 연산 기준 자릿수(오라클의 ROUND함수 자릿수 기준)
	 *                   -2:십단위, -1:원단위, 0:소수점 1자리
	 *                   1:소수점 2자리, 2:소수점 3자리, 3:소수점 4자리, 4:소수점 5자리 처리
	 * @return String nCalcVal
	 */
	public static String 반올림(double nCalcVal, int nDigit){
		if(nDigit < 0){
			nDigit = -(nDigit);
			nCalcVal = Math.round(nCalcVal / Math.pow(10, nDigit)) * Math.pow(10, nDigit);
		}else{
			nCalcVal = Math.round(nCalcVal * Math.pow(10, nDigit)) / Math.pow(10, nDigit);
		}
		return String.valueOf(nCalcVal);
	}
	
	public static String 절상(double nCalcVal, int nDigit){
		if(nDigit < 0) {
			nDigit = -(nDigit);
			nCalcVal = Math.ceil(nCalcVal / Math.pow(10, nDigit)) * Math.pow(10, nDigit);
		} else {
			nCalcVal = Math.ceil(nCalcVal * Math.pow(10, nDigit)) / Math.pow(10, nDigit);
		}
		return String.valueOf(nCalcVal);
	}
	
	public static String 절사(double nCalcVal, int nDigit){
		if(nDigit < 0) {
			nDigit = -(nDigit);
			nCalcVal = Math.floor(nCalcVal / Math.pow(10, nDigit)) * Math.pow(10, nDigit);
		} else {
			nCalcVal = Math.floor(nCalcVal * Math.pow(10, nDigit)) / Math.pow(10, nDigit);
		}
		return String.valueOf(nCalcVal);
	}
	// 최대 공약수
	public static int getGCD(int a, int b)
	{
		if (b == 0)
			return a;
		else
			return getGCD(b, a % b);
	}
	public void quickSort(int[] sortData, int left, int right)
	{
		int i, j, temp, pivot;	
		
		if (left < right)
		{
			i = left;
			j = right;
			pivot = sortData[left];
			// 분할
			while (i < j)
			{
				while (sortData[j] > pivot)
					j--;
				while (i < j && sortData[i] <= pivot)
					i++;
				// 비교데이터 swap
				temp = sortData[i];
				sortData[i] = sortData[j];
				sortData[j] = temp;
			}
			// 비교데이터
			if (sortData[left] != sortData[i])
			{
				sortData[left] = sortData[i];
				sortData[i] = pivot;
			}
			// 정렬
			quickSort(sortData, left, i - 1);
			quickSort(sortData, i + 1, right);
		}
	}
	public void quickSort(int[] sortData, Object[] datas, int left, int right)
	{
		int i, j, temp, pivot;	
		Object pivotData, tempObject;
		
		if (left < right)
		{
			i = left;
			j = right;
			pivot = sortData[left];
			pivotData = datas[left];
			// 분할
			while (i < j)
			{
				while (sortData[j] > pivot)
					j--;
				while (i < j && sortData[i] <= pivot)
					i++;
				// 비교데이터 swap
				temp = sortData[i];
				sortData[i] = sortData[j];
				sortData[j] = temp;
				// 실데이터 swap
				tempObject = datas[i];
				datas[i] = datas[j];
				datas[j] = tempObject;
			}
			// 비교데이터
			if (sortData[left] != sortData[i])
			{
				sortData[left] = sortData[i];
				sortData[i] = pivot;
				// 실데이터
				datas[left] = datas[i];
				datas[i] = pivotData;
			}
			// 정렬
			quickSort(sortData, datas, left, i - 1);
			quickSort(sortData, datas, i + 1, right);
		}
	}
}
